using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using webapi.Domain.Repository;
using webapi.Infrastructure.Cto;
using webapi.Infrastructure.Utils;
using Webapi.Domain.Entity;

namespace webapi.api.Controllers
{
    [ApiController]
    [Route("controller")]
    public class FilesController : ControllerBase
    {

        private readonly IConfiguration _IConfiggraution;
        private readonly IRepository<UploadFiles> _uploadFiles;

        public FilesController(IConfiguration IConfiggraution, IRepository<UploadFiles> uploadFile)
        {
            _IConfiggraution = IConfiggraution;
            _uploadFiles = uploadFile;
        }

        [HttpPost]
        [Route("/files")]
        public async Task<string> OnPostUploadAsync(IFormCollection files)
        {
            // 当前路径
            var currentPath = Directory.GetCurrentDirectory().ToString();

            // 配置路径 | 配置文件名
            var configFileName = _IConfiggraution.GetSection("UploadFiles").GetValue<string>("UploadFiles");
            var list = new List<string>();

            // string[] permittedExtensions = _IConfiggraution.GetSection("UploadFiles").GetValue<string>("AllowUploadFilesType").Split(",");

            // var MaxFileSize = _IConfiggraution.GetSection("UploadFiles").GetValue<long>("MaxFileSize");
            // var uploadedFileExtens = files.Files.Where(x =>
            //            {
            //                var ext = Path.GetExtension(x.FileName).ToLowerInvariant();
            //                return string.IsNullOrEmpty(ext) || !permittedExtensions.Contains(ext);
            //            });
            // var count = uploadedFileExtens.Count();
            // if (count > 0)
            // {
            //     return new ResResult
            //     {
            //         code = 4000,
            //         msg = "不允许上传的文件",
            //         data = ""
            //     }.JsonSerialize();
            // }

            // // 查找这（上传的文件中的文件大小）有没有任何超过允许的最大的大小的情况，如果有，则全部拒绝上传   
            // var uploadeFileMaxSize = files.Files.Where(x =>
            // {
            //     return x.Length > MaxFileSize;
            // });

            // if (uploadeFileMaxSize.Count() > 0)
            // {
            //     return new ResResult
            //     {
            //         code = 4000,
            //         msg = "上传的文件中有超过最大允许的大小",
            //         data = ""
            //     }.JsonSerialize();
            // }


            foreach (var formFile in files.Files)
            {
                if (formFile.Length > 0)
                {
                    var now = DateTime.Now;
                    // 配置路径+年+月+日
                    var fullFilePath = Path.Combine(configFileName, now.Year.ToString(), now.Month.ToString(), now.Day.ToString());

                    // 完整路径
                    var fullFile = Path.Combine(currentPath, fullFilePath);

                    // 是否存在 不存在则新建文件
                    if (!Directory.Exists(fullFile))
                    {
                        Directory.CreateDirectory(fullFile);
                    }

                    // 随机生成一个guid，用来替换上传文件名
                    var randName = Guid.NewGuid().ToString("N");

                    // 获取文件后缀名
                    var extName = formFile.FileName.Substring(formFile.FileName.IndexOf("."));

                    // 允许上传的文件类型，以逗号分隔


                    var newFileName = randName + extName;

                    // 获取原始文件名
                    var fileNameLength = formFile.FileName.Length - extName.Length;
                    var OriginalFilesName = formFile.FileName.Substring(0, fileNameLength);

                    // 获取文件类型
                    var extType = extName.Replace(".", "");

                    // 完整文件
                    var completefile = Path.Combine(fullFile, newFileName).Replace("\\", "/");


                    // 获取文件大小
                    // var fileSize = formFile.FileName.Sum(f => f.Length);
                    // long sizeOfDir = DirectorySize(fullFile, true);

                    // 获取文件夹路径
                    // var uploadFilesPath = Path.Combine(currentPath, fullFilePath);
                    // // DirectoryInfo dInfo = new DirectoryInfo(@"C:/Articles");
                    // // long sizeOfDir = getDirectorySize(dInfo, true);

                    // // FileStream fs = new FileStream(completefile, FileMode.Open, FileAccess.Read);
                    // // long contentLength = fs.Length;

                    // DirectoryInfo directoryInfo = new DirectoryInfo(fullFile);
                    // foreach (FileInfo fileInfo in directoryInfo.GetFiles())
                    // {
                    //     // Console.WriteLine(fileInfo.Name);
                    //     // Console.WriteLine(fileInfo.FullName);
                    //     FileStream fs = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read);
                    //     long contentLength = fs.Length;
                    //     // list.Add(contentLength.ToString());
                    // }

                    // 获取相对地址
                    var relativeFilesPath = Path.Combine(fullFilePath, newFileName).Replace("\\", "/");

                    using (var stream = System.IO.File.Create(completefile))
                    {
                        await formFile.CopyToAsync(stream);
                    }



                    // list.Add(relativeFilesPath); // 文件的（相对）地址
                    // list.Add(OriginalFilesName); // 原始文件名
                    // list.Add(randName); // 新的文件名
                    // list.Add(extType); // 文件类型
                    list.Add(extName); // 文件类型
                    list.Add("extName"); // 文件类型
                    // list.Add(completefile);// 完整文件
                    // list.Add(uploadFilesPath); // 获取文件夹路径
                    // list.Add(contentLength.ToString()); // 获取文件夹大小
                    var filedata = new UploadFiles
                    {
                        OriginalFilesName = OriginalFilesName,
                        newFileName = randName,
                        fileType = extType,
                        relativeFilesPath = relativeFilesPath,
                        fileSize = formFile.Length
                    };
                    _uploadFiles.Add(filedata);
                }

            }

            // 原始文件名          OriginalFilesName 
            // 新的文件名           newFileName
            // 文件类型             fileType
            // 文件大小             fileSize
            // 文件的（相对）地址       relativeFilesPath

            // return Ok(new { count = files.Count, size });
            return new ResResult
            {
                code = 1000,
                msg = "上传成功",
                data = list
            }.JsonSerialize();
        }
    }
}
